import market.Order;
import market.constant.CommonConstant;
import market.impl.*;
import org.junit.Test;
import static org.junit.Assert.*;

import java.math.BigDecimal;

/**
 * 问题测试类
 */
public class MarketQuestionTest {

    /**
     * 1、有一家超市，出售苹果和草莓。其中苹果 8 元/斤，草莓 13 元/斤。
     * 现在顾客 A 在超市购买了若干斤苹果和草莓，需要计算一共多少钱？
     */
    @Test
    public void testQuestion1() throws Exception {
        // 创建订单
        Order order = new Order(CommonConstant.NO_SALE_PROXY);
        // 添加水果
        order.addFruits(new Apple(3));
        order.addFruits(new Strawberry(2, CommonConstant.NO_DISCOUNT_PROXY));
        BigDecimal orderPrice = order.calculateTotalPrice();
        assertEquals(50.0, orderPrice.doubleValue(), 0.001);
    }

    /**
     * 超市增加了一种水果芒果，其定价为 20 元/斤。
     * 现在顾客 B 在超市购买了若干斤苹果、 草莓和芒果，需计算一共需要多少钱？
     * */
    @Test
    public void testQuestion2() throws Exception {
        // 创建订单
        Order order = new Order(CommonConstant.NO_SALE_PROXY);
        // 添加水果
        order.addFruits(new Apple(3));
        order.addFruits(new Strawberry(2, CommonConstant.NO_DISCOUNT_PROXY));
        order.addFruits(new Mango(3));
        BigDecimal orderPrice = order.calculateTotalPrice();
        assertEquals(110.0, orderPrice.doubleValue(), 0.001);
    }

    /**
     * 超市做促销活动，草莓限时打 8 折。
     * 现在顾客 C 在超市购买了若干斤苹果、 草莓和芒果，需计算一共需要多少钱？
     */
    @Test
    public void testQuestion3() throws Exception {
        // 创建订单
        Order order = new Order(CommonConstant.NO_SALE_PROXY);
        // 添加水果
        order.addFruits(new Apple(3));
        order.addFruits(new Strawberry(2, CommonConstant.EIGHT_DISCOUNT_PROXY));
        order.addFruits(new Mango(3));
        BigDecimal orderPrice = order.calculateTotalPrice();
        assertEquals(104.8, orderPrice.doubleValue(), 0.001);
    }

    /**
     * 促销活动效果明显，超市继续加大促销力度，购物满 100 减 10 块。
     * 现在顾客 D 在超市购买了若干斤苹果、 草莓和芒果，需计算一共需要多少钱？
     */
    @Test
    public void testQuestion4() throws Exception {
        // 创建订单
        Order order = new Order(CommonConstant.ONE_HUNDRED_MINUS_TEN_SALE_PROXY);
        // 添加水果
        order.addFruits(new Apple(3));
        order.addFruits(new Strawberry(2, CommonConstant.EIGHT_DISCOUNT_PROXY));
        order.addFruits(new Mango(3));
        BigDecimal orderPrice = order.calculateTotalPrice();
        assertEquals(94.8, orderPrice.doubleValue(), 0.001);
    }

    /**
     * 当金额小于100时，不会扣减金额，返回原价
     */
    @Test
    public void testBoundary() throws Exception {
        // 创建订单
        Order order = new Order(new OneHundredMinusTenSaleProxy());
        // 添加水果
        order.addFruits(new Apple(3));
        order.addFruits(new Strawberry(2, new EightDiscountProxy()));
        order.addFruits(new Mango(2));
        BigDecimal orderPrice = order.calculateTotalPrice();
        assertEquals(84.8, orderPrice.doubleValue(), 0.001);
    }
}